/***********************************************************************************
Copy right:	    Coffee Tech.
Author:         jiaoyue
Date:           2022-03-23
Description:    http请求处理
***********************************************************************************/

#include "req_handle.h"
#include "log_console.h"
#include "custom_handle.h"

/**
 * @brief 处理请求
 * @param argc
 * @param argv
 * @return
 */
int handle_request(int argc, char *argv[])
{
    int ret;

	if (argc <= 0)
	{
        log_console("argc error\n");
		return -1;
	}

	//获取访问此页面所需的URI。例如，“/index.html”。
    char *uri = getenv("REQUEST_URI");
    //获取前端请求方式
    char *request_method = getenv("REQUEST_METHOD");

    log_console("uri = %s\n", uri);
    log_console("req = %s\n", request_method);

    if(NULL == request_method)
    {
        log_console("error to get request_method\n");
        exit(-1);
    }

    //get方法我们不处理，交由服务器自己处理
    if (strcasecmp(request_method, "POST") != 0)
    {
        log_console("only handle post\n");
        return 0;
    }

    //获取用户数据长度
    char *len_tmp = getenv("CONTENT_LENGTH");  //get CONTENT_LENGTH from env

    int content_length;
    if (len_tmp != NULL)
    {
        content_length = atoi(len_tmp);

        if (content_length <= 0)
        {
            return -1;
        }
    }
    else
    {
        log_console("request_content length error");
        return -1;
    }

    char *content_type = getenv("CONTENT_TYPE");
    //打印下CONTENT_TYPE看看，我们只处理普通请求
    log_console("content_type=%s\n", content_type);

    //普通请求处理
    char *request_content = malloc(content_length + 1);
    if (!request_content)
    {
        return -1;
    }

    int len = 0;
    //从标准输入中读取数据到content中
    while (len < content_length)
    {
        ret = fread(request_content + len, 1, content_length - len, stdin);

        if (ret < 0)
        {
            free(request_content);
            return -1;
        }
        else if (ret > 0)
        {
            len += ret;
        }
        else
        {
            break;
        }
    }

    if (len != content_length)
    {
        log_console("fread len != content_length");
        free(request_content);
        return -1;
    }

    //此时所有的请求内容都存到request_conten中了
    request_content[len] = '\0';
    log_console("notice request_content = %s\n", request_content);
    ret = parse_and_process(request_content);
    if(ret < 0)
    {
        log_console("error to parse\n");
    }
    free(request_content);

    return ret;
}
